#include "gobang_algorithm.h"

gobang_algorithm::gobang_algorithm()
{ 
	dir[0][0]=1;dir[0][1]=0;dir[1][0]=1;dir[1][1]=1;dir[2][0]=0;dir[2][1]=1;dir[3][0]=-1;dir[3][1]=1;
	dir[4][0]=-1;dir[4][1]=0;dir[5][0]=-1;dir[5][1]=-1;dir[6][0]=0;dir[6][1]=-1;dir[7][0]=1;dir[7][1]=-1;
	for(int i=0;i<20;i++){
		for(int j=0;j<20;j++){
			Arr[i][j]=0;
		}
	}
	sum=0;
}

bool gobang_algorithm::in(int x,int y){
	return x>=0&&x<15&&y>=0&&y<15;
}

int gobang_algorithm::there(int x,int y){
	temp=0;
	for(int i=0;i<4;i++){
		Count[i]=1;
		sum=0;
        dx0=x+dir[i][0];
        dy0=y+dir[i][1];
        dx1=x+dir[i+4][0];
        dy1=y+dir[i+4][1];
        while(in(dx0,dy0)&&Arr[dx0][dy0]==1){
            dx0+=dir[i][0];
            dy0+=dir[i][1];
            Count[i]++;
        }
        while(in(dx1,dy1)&&Arr[dx1][dy1]==1){
            dx1+=dir[i+4][0];
            dy1+=dir[i+4][1];
            Count[i]++;
        }
        if(Count[i]>=3){
           if(Arr[dx1][dy1]==0&&(Arr[dx0][dy0]==0)){
                dx0+=dir[i][0];
            	dy0+=dir[i][1];
            	dx1+=dir[i+4][0];
            	dy1+=dir[i+4][1];
            	if(in(dx0,dy0)&&Arr[dx0][dy0]==1&&in(dx1,dy1)&&Arr[dx1][dy1]==1){
                    temp+=2;
            	}else {
                    temp++;
            	}
            }
        }else{
            tempdx0=dx0,tempdy0=dy0;line=0;
            if(Arr[dx1][dy1]==2){
                while(in(dx0,dy0)&&Arr[dx0][dy0]==1){
                    dx0+=dir[i][0];
                    dy0+=dir[i][1];
                    line++;
                }
                line+=Count[i];
                if(line>=3)temp++;
            }else if(in(dx1,dy1)&&Arr[dx1][dy1]==0){
                dx0+=dir[i][0];
                dy0+=dir[i][1];
                while(in(dx0,dy0)&&Arr[dx0][dy0]==1){
                    dx0+=dir[i][0];
                    dy0+=dir[i][1];
                    line++;
                }
                line+=Count[i];
                if(line>=3)temp++;
            }
            dx0=tempdx0,dy0=tempdy0;
            line=0;
            if(Arr[dx0][dy0]==2){
                while(in(dx0,dy0)&&Arr[dx0][dy0]==1){
                    dx1+=dir[i+4][0];
                    dy1+=dir[i+4][1];
                    line++;
                }
                line+=Count[i];
        	if(line>=3)temp++;
            }else if(in(dx0,dy0)&&Arr[dx0][dy0]==0){
                dx1+=dir[i+4][0];
                dy1+=dir[i+4][1];
                while(in(dx1,dy1)&&Arr[dx1][dy1]==1){
                    dx1+=dir[i+4][0];
                    dy1+=dir[i+4][1];
                    line++;
                }
                line+=Count[i];
                if(line>=3) temp++;
            }
        }
    }
    if(temp>=2)return 1;
    return 0;
}
int gobang_algorithm::four(int x,int y){
	flag=0;
	for(int i=0;i<8;i++)Count[i]=1;
    for(int i=0;i<4;i++){
        dx0=x+dir[i][0];
        dy0=y+dir[i][1];
        dx1=x+dir[i+4][0];
        dy1=y+dir[i+4][1];
        while(in(dx0,dy0)&&Arr[dx0][dy0]==1){
            dx0+=dir[i][0];
            dy0+=dir[i][1];
            Count[i]++;
        }
        while(in(dx1,dy1)&&Arr[dx1][dy1]==1){
            dx1+=dir[i+4][0];
            dy1+=dir[i+4][1];
            Count[i]++;
        }
        if(Count[i]==4){
            if((in(dx0,dy0)&&Arr[dx0][dy0]!=2)||(in(dx1,dy1)&&Arr[dx1][dy1]!=2))
                flag++;
        }
    }
    if(flag>=2)return 1;
    return 0;
}
int gobang_algorithm::five(int x,int y,int Num){
	flag=0;
	for(int i=0;i<8;i++)Count[i]=1;
        for(int i=0;i<4;i++){
            int dx0=x+dir[i][0];
            int dy0=y+dir[i][1];
            int dx1=x+dir[i+4][0];
            int dy1=y+dir[i+4][1];
            while(in(dx0,dy0)&&Arr[dx0][dy0]==Num){
                dx0+=dir[i][0];
                dy0+=dir[i][1];
                Count[i]++;
            }
            while(in(dx1,dy1)&&Arr[dx1][dy1]==Num){
                dx1+=dir[i+4][0];
                dy1+=dir[i+4][1];
                Count[i]++;
            }
            if(Count[i]==5){
                return 1;
            }
            //sum+=Count[i];
        }
        return 0;
}
int gobang_algorithm::six(int x,int y){
	flag=0;
	for(int i=0;i<8;i++)Count[i]=1;
    for(int i=0;i<4;i++){
        int dx0=x+dir[i][0];
        int dy0=y+dir[i][1];
        int dx1=x+dir[i+4][0];
        int dy1=y+dir[i+4][1];
        while(in(dx0,dy0)&&Arr[dx0][dy0]==1){
            dx0+=dir[i][0];
            dy0+=dir[i][1];
            Count[i]++;
        }
        while(in(dx1,dy1)&&Arr[dx1][dy1]==1){
            dx1+=dir[i+4][0];
            dy1+=dir[i+4][1];
            Count[i]++;
        }
        if(Count[i]>5){
            return 1;
        }
    }
    return 0;
}
int gobang_algorithm::judge(int x,int y,int Num){
	Arr[x][y]=Num;
	if(five(x,y,Num)){
		if(Num==1){
			return 1;
         }else{
			 return 2;
          }
	}
	if(Arr[x][y]==1&&(six(x,y)||four(x,y)||there(x,y))){
                return 2;
    }
	return 0;
}
